package main

import "fmt"

// 全局变量定义在包级别
var globalVar string = "加油 加油 GO GO GO!!!"

func basic() {
	//变量 在go语言中定义之后未使用的变量会报错
	//变量定义规则 var varName type = xxx;
	//var s string = "goLand"
	s := "gopher" //简写

	//变量交换语法糖
	var a int = 0
	var b int = 1
	fmt.Printf("变量交换之前a:%d ,b:%d \n", a, b)
	a, b = b, a
	fmt.Printf("变量交换之后a:%d ,b:%d \n", a, b)
	//使用全局变量
	fmt.Println("不管干什么我们都要" + globalVar)
	//常量定义
	const name string = "Go Project"
	fmt.Println("欢迎来到Go语言课堂!!!" + name)
	//Println，不会对参数进行格式化，Printf会对输出进行格式化占位符生效
	fmt.Printf("Hello and welcome,%s\n", s)

	//数组var varName [size]type = [size]type;
	var arr [5]int = [5]int{1, 2, 3, 4, 5}
	//切片 var arrName []type = [] type;
	var splice []string = []string{"python", "java", "golang"}
	//splice[:1] 获取数组下标1之前的数 splice[1:]获取数组下标1之后的数
	splice = append(splice, "mysql")
	fmt.Printf("向集合中添加数据:%s\n", splice)

	//使用make创建 make(type[类型],len[初始长度],cap[最大容量])
	var spliceMake []int = make([]int, 5, 10)
	fmt.Printf("arr:%v len:%d,cap:%d\n", spliceMake, len(spliceMake), cap(spliceMake))
	//删除集合中下标未1的数据
	splice = append(splice[:1], splice[2:]...) //将原集合中下标1之前不包含1 小标2及之后的数据从新赋值给splice集合
	fmt.Printf("集合删除操作之后:%s\n", splice)

	//map 集合 var mapName map[keyType] valueType = map[keyType][valueType]
	var varMap map[string]int = map[string]int{"a": 1, "b": 2}
	//var varMakeMap map[string]int = map[string]int{"a": 1, "b": 2}
	fmt.Printf("varMap:%v\n", varMap)

	//流程控制
	//for
	for i := 1; i <= 5; i++ {
		fmt.Println("i =", 100/i)
	}
	//range 的使用
	for i := range arr {
		fmt.Println(i)
	}

	//switch [expr]{ } //不带表达式时case捕获的是bool类型,一个case结束之后不会执行下一个case
	switch {
	case a > 0:
		fmt.Println("a>0")
		fallthrough //穿透到下一个case
	case a < 0:
		if a == 0 {
			break
		}
		fmt.Println("a<0")
	default:
		fmt.Println("a<=0")
	}

	//函数调用
	NoParmaMethod()
	x, err := method(10, 10)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("运行结果：%d \n", x)

	//接口方法调用
	var p person = person{}
	p.name = "小李 加油加油GO GO GO"
	p.sex = 1
	p.age = 26
	fmt.Println(p.Desc())
}
